Skip to content

chore: add OHLCVService for real-time candlestick WebSocket streaming#8695

Merged
sahar-fehri merged 30 commits into
mainfrom
chore/add-ohlcv-websocket
May 13, 2026
Merged

chore: add OHLCVService for real-time candlestick WebSocket streaming#8695
sahar-fehri merged 30 commits into
mainfrom
chore/add-ohlcv-websocket

Conversation

@sahar-fehri
Copy link
Copy Markdown
Contributor

@sahar-fehri sahar-fehri commented May 5, 2026

Explanation

Architecture Overview

┌─────────────────┐        messenger         ┌──────────────────────────┐
│   OHLCVService   │ ─── calls actions ────► │  BackendWebSocketService  │
│  (domain logic)  │                          │  (raw WS connection)      │
│                  │ ◄── listens to events ── │                           │
└────────┬────────┘                           └──────────┬───────────────┘
         │                                               │
    publishes events                              actual WebSocket
    to UI consumers                          (connect, auth, reconnect,
                                              heartbeat, JSON framing)
         │
         ▼
┌──────────────────┐
│   Mobile UI       │
│  (React hooks)    │
│  useOHLCVRealtime │
└──────────────────┘

What

  • Add OHLCVService for real-time OHLCV (candlestick) data streaming via the backend WebSocket gateway
  • Move all WebSocket-related files (BackendWebSocketService, AccountActivityService) into a new src/ws/ directory per code review feedback

Why

  • Enable real-time chart updates on the Token Details screen without polling
  • Reduce API load by replacing periodic HTTP calls with persistent WebSocket subscriptions
  • Organize WebSocket code into a dedicated ws/ folder for better discoverability

New files

  • src/ws/ohlcv/OHLCVService.ts — main service with subscribe/unsubscribe semantics, reference counting, grace-period unsubscribe, idempotency checks, chain-status forwarding, and automatic resubscription on reconnect
  • src/ws/ohlcv/OHLCVService.test.ts — 22 unit tests covering all paths (100% branch coverage)
  • src/ws/ohlcv/OHLCVService-method-action-types.ts — auto-generated messenger action types
  • src/ws/ohlcv/types.tsOHLCVBar and OHLCVSubscriptionOptions types
  • src/ws/ohlcv/index.ts — barrel exports

Modified files

  • src/index.ts — added exports for OHLCVService, its types, and allowed actions/events; updated import paths to ./ws/
  • eslint-suppressions.json — updated paths for moved files, added suppressions for new test file
  • CHANGELOG.md — documented new service and exports

Moved files (no logic changes)

  • src/BackendWebSocketService.tssrc/ws/BackendWebSocketService.ts
  • src/BackendWebSocketService.test.tssrc/ws/BackendWebSocketService.test.ts
  • src/BackendWebSocketService-method-action-types.tssrc/ws/BackendWebSocketService-method-action-types.ts
  • src/AccountActivityService.tssrc/ws/AccountActivityService.ts
  • src/AccountActivityService.test.tssrc/ws/AccountActivityService.test.ts
  • src/AccountActivityService-method-action-types.tssrc/ws/AccountActivityService-method-action-types.ts
  • Only import path updates (./logger../logger, ./types../types, test helper paths)

Key design decisions

  • UI-driven lifecycle — unlike AccountActivityService (auto-subscribes on account change), OHLCVService exposes subscribe()/unsubscribe() called by the UI when the chart mounts/unmounts
  • Reference counting — multiple UI consumers subscribing to the same assetId/interval/currency share one WebSocket subscription
  • Grace period (3s) — when all consumers unsubscribe, actual WS unsubscribe is delayed 3 seconds to absorb rapid navigation (Token A → Token B → Token A)
  • Idempotency — uses channelHasSubscription before subscribing; duplicate calls are no-ops (React Strict Mode safe)
  • Chain status — listens to system-notifications.v1.market-data.v1 (auto-subscribed by server) and publishes OHLCVService:chainStatusChanged
  • Disconnect handling — on WebSocket disconnect, publishes chainStatusChanged { status: 'down' } for all tracked chains, triggering UI polling fallback
  • Reconnect — resubscribes all active channels when WebSocket reconnects (no sessionId needed for OHLCV; UI polling fallback covers the gap)
  • init() method — system notification callback registered in init() (not constructor) to comply with messenger-in-constructor lint rule

Events published

  • OHLCVService:barUpdated{ channel, bar: OHLCVBar } — new candle data from WebSocket
  • OHLCVService:chainStatusChanged{ chainIds, status, timestamp? } — chain up/down (server notification or WS disconnect)
  • OHLCVService:subscriptionError{ channel, error, operation } — subscribe or unsubscribe failure

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Adds a new WebSocket-driven market-data service with reference counting, timers, and reconnect resubscription logic, which can affect subscription lifecycles and event delivery. Also moves existing WebSocket services into src/ws/, so consumers relying on internal paths (vs package exports) could break if any remain.

Overview
Adds a new OHLCVService to stream real-time OHLCV bars over WebSocket, exposing subscribe/unsubscribe via messenger actions, publishing barUpdated/chainStatusChanged/subscriptionError events, and handling reconnect resubscription with ref-counting plus a grace-period unsubscribe (mutex-protected).

Refactors core-backend by moving BackendWebSocketService and AccountActivityService (and their tests/action-type files) into src/ws/, updating imports/exports (src/index.ts), and updating lint suppressions; also adds async-mutex plus comprehensive unit tests for the new service and documents the addition in the changelog.

Reviewed by Cursor Bugbot for commit 730af62. Bugbot is set up for automated code reviews on this repo. Configure here.

@sahar-fehri sahar-fehri changed the title chore: add ohlcv websocket chore: add OHLCVService for real-time candlestick WebSocket streaming May 5, 2026
@sahar-fehri sahar-fehri force-pushed the chore/add-ohlcv-websocket branch from 2d69c0f to bd0d4d2 Compare May 5, 2026 13:04
@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.2.0-preview-bd0d4d2e9
@metamask-previews/accounts-controller@38.0.0-preview-bd0d4d2e9
@metamask-previews/address-book-controller@7.1.1-preview-bd0d4d2e9
@metamask-previews/ai-controllers@0.6.3-preview-bd0d4d2e9
@metamask-previews/analytics-controller@1.0.1-preview-bd0d4d2e9
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-bd0d4d2e9
@metamask-previews/announcement-controller@8.1.0-preview-bd0d4d2e9
@metamask-previews/app-metadata-controller@2.0.1-preview-bd0d4d2e9
@metamask-previews/approval-controller@9.0.1-preview-bd0d4d2e9
@metamask-previews/assets-controller@6.3.0-preview-bd0d4d2e9
@metamask-previews/assets-controllers@105.1.0-preview-bd0d4d2e9
@metamask-previews/authenticated-user-storage@1.0.0-preview-bd0d4d2e9
@metamask-previews/base-controller@9.1.0-preview-bd0d4d2e9
@metamask-previews/base-data-service@0.1.1-preview-bd0d4d2e9
@metamask-previews/bridge-controller@71.0.0-preview-bd0d4d2e9
@metamask-previews/bridge-status-controller@71.1.0-preview-bd0d4d2e9
@metamask-previews/build-utils@3.0.4-preview-bd0d4d2e9
@metamask-previews/chain-agnostic-permission@1.5.0-preview-bd0d4d2e9
@metamask-previews/chomp-api-service@3.0.0-preview-bd0d4d2e9
@metamask-previews/claims-controller@0.5.0-preview-bd0d4d2e9
@metamask-previews/client-controller@1.0.1-preview-bd0d4d2e9
@metamask-previews/compliance-controller@2.0.0-preview-bd0d4d2e9
@metamask-previews/composable-controller@12.0.1-preview-bd0d4d2e9
@metamask-previews/config-registry-controller@0.3.0-preview-bd0d4d2e9
@metamask-previews/connectivity-controller@0.2.0-preview-bd0d4d2e9
@metamask-previews/controller-utils@11.20.0-preview-bd0d4d2e9
@metamask-previews/core-backend@6.2.1-preview-bd0d4d2e9
@metamask-previews/delegation-controller@3.0.0-preview-bd0d4d2e9
@metamask-previews/earn-controller@12.1.0-preview-bd0d4d2e9
@metamask-previews/eip-5792-middleware@3.0.3-preview-bd0d4d2e9
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-bd0d4d2e9
@metamask-previews/eip1193-permission-middleware@2.0.0-preview-bd0d4d2e9
@metamask-previews/ens-controller@19.1.1-preview-bd0d4d2e9
@metamask-previews/eth-block-tracker@15.0.1-preview-bd0d4d2e9
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-bd0d4d2e9
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-bd0d4d2e9
@metamask-previews/foundryup@1.0.1-preview-bd0d4d2e9
@metamask-previews/gas-fee-controller@26.1.1-preview-bd0d4d2e9
@metamask-previews/gator-permissions-controller@4.0.0-preview-bd0d4d2e9
@metamask-previews/geolocation-controller@0.1.2-preview-bd0d4d2e9
@metamask-previews/json-rpc-engine@10.3.0-preview-bd0d4d2e9
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-bd0d4d2e9
@metamask-previews/keyring-controller@25.4.0-preview-bd0d4d2e9
@metamask-previews/logging-controller@8.0.1-preview-bd0d4d2e9
@metamask-previews/message-manager@14.1.1-preview-bd0d4d2e9
@metamask-previews/messenger@1.2.0-preview-bd0d4d2e9
@metamask-previews/messenger-cli@0.2.0-preview-bd0d4d2e9
@metamask-previews/money-account-balance-service@0.2.0-preview-bd0d4d2e9
@metamask-previews/money-account-controller@0.2.0-preview-bd0d4d2e9
@metamask-previews/money-account-upgrade-controller@1.3.0-preview-bd0d4d2e9
@metamask-previews/multichain-account-service@8.0.1-preview-bd0d4d2e9
@metamask-previews/multichain-api-middleware@3.0.0-preview-bd0d4d2e9
@metamask-previews/multichain-network-controller@3.1.0-preview-bd0d4d2e9
@metamask-previews/multichain-transactions-controller@7.1.0-preview-bd0d4d2e9
@metamask-previews/name-controller@9.1.1-preview-bd0d4d2e9
@metamask-previews/network-controller@30.1.0-preview-bd0d4d2e9
@metamask-previews/network-enablement-controller@5.1.0-preview-bd0d4d2e9
@metamask-previews/notification-services-controller@23.1.0-preview-bd0d4d2e9
@metamask-previews/passkey-controller@2.0.0-preview-bd0d4d2e9
@metamask-previews/permission-controller@13.0.0-preview-bd0d4d2e9
@metamask-previews/permission-log-controller@5.1.0-preview-bd0d4d2e9
@metamask-previews/perps-controller@5.0.0-preview-bd0d4d2e9
@metamask-previews/phishing-controller@17.1.1-preview-bd0d4d2e9
@metamask-previews/polling-controller@16.0.4-preview-bd0d4d2e9
@metamask-previews/preferences-controller@23.1.0-preview-bd0d4d2e9
@metamask-previews/profile-metrics-controller@3.1.3-preview-bd0d4d2e9
@metamask-previews/profile-sync-controller@28.0.2-preview-bd0d4d2e9
@metamask-previews/ramps-controller@13.2.0-preview-bd0d4d2e9
@metamask-previews/rate-limit-controller@7.0.1-preview-bd0d4d2e9
@metamask-previews/react-data-query@0.2.0-preview-bd0d4d2e9
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-bd0d4d2e9
@metamask-previews/sample-controllers@4.0.4-preview-bd0d4d2e9
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-bd0d4d2e9
@metamask-previews/selected-network-controller@26.1.1-preview-bd0d4d2e9
@metamask-previews/shield-controller@5.1.1-preview-bd0d4d2e9
@metamask-previews/signature-controller@39.2.0-preview-bd0d4d2e9
@metamask-previews/snap-account-service@0.0.0-preview-bd0d4d2e9
@metamask-previews/social-controllers@2.2.0-preview-bd0d4d2e9
@metamask-previews/storage-service@1.0.1-preview-bd0d4d2e9
@metamask-previews/subscription-controller@6.1.2-preview-bd0d4d2e9
@metamask-previews/transaction-controller@65.0.0-preview-bd0d4d2e9
@metamask-previews/transaction-pay-controller@21.0.0-preview-bd0d4d2e9
@metamask-previews/user-operation-controller@41.2.0-preview-bd0d4d2e9

@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-3569042f0
@metamask-previews/accounts-controller@38.0.0-preview-3569042f0
@metamask-previews/address-book-controller@7.1.1-preview-3569042f0
@metamask-previews/ai-controllers@0.6.3-preview-3569042f0
@metamask-previews/analytics-controller@1.0.1-preview-3569042f0
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-3569042f0
@metamask-previews/announcement-controller@8.1.0-preview-3569042f0
@metamask-previews/app-metadata-controller@2.0.1-preview-3569042f0
@metamask-previews/approval-controller@9.0.1-preview-3569042f0
@metamask-previews/assets-controller@7.0.0-preview-3569042f0
@metamask-previews/assets-controllers@106.0.0-preview-3569042f0
@metamask-previews/authenticated-user-storage@1.0.0-preview-3569042f0
@metamask-previews/base-controller@9.1.0-preview-3569042f0
@metamask-previews/base-data-service@0.1.1-preview-3569042f0
@metamask-previews/bridge-controller@72.0.1-preview-3569042f0
@metamask-previews/bridge-status-controller@71.1.1-preview-3569042f0
@metamask-previews/build-utils@3.0.4-preview-3569042f0
@metamask-previews/chain-agnostic-permission@1.6.0-preview-3569042f0
@metamask-previews/chomp-api-service@3.0.0-preview-3569042f0
@metamask-previews/claims-controller@0.5.0-preview-3569042f0
@metamask-previews/client-controller@1.0.1-preview-3569042f0
@metamask-previews/compliance-controller@2.0.0-preview-3569042f0
@metamask-previews/composable-controller@12.0.1-preview-3569042f0
@metamask-previews/config-registry-controller@0.3.0-preview-3569042f0
@metamask-previews/connectivity-controller@0.2.0-preview-3569042f0
@metamask-previews/controller-utils@11.20.0-preview-3569042f0
@metamask-previews/core-backend@6.2.1-preview-3569042f0
@metamask-previews/delegation-controller@3.0.0-preview-3569042f0
@metamask-previews/earn-controller@12.1.0-preview-3569042f0
@metamask-previews/eip-5792-middleware@3.0.3-preview-3569042f0
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-3569042f0
@metamask-previews/eip1193-permission-middleware@2.0.0-preview-3569042f0
@metamask-previews/ens-controller@19.1.1-preview-3569042f0
@metamask-previews/eth-block-tracker@15.0.1-preview-3569042f0
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-3569042f0
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-3569042f0
@metamask-previews/foundryup@1.0.1-preview-3569042f0
@metamask-previews/gas-fee-controller@26.2.0-preview-3569042f0
@metamask-previews/gator-permissions-controller@4.1.0-preview-3569042f0
@metamask-previews/geolocation-controller@0.1.2-preview-3569042f0
@metamask-previews/json-rpc-engine@10.5.0-preview-3569042f0
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-3569042f0
@metamask-previews/keyring-controller@25.5.0-preview-3569042f0
@metamask-previews/logging-controller@8.0.1-preview-3569042f0
@metamask-previews/message-manager@14.1.1-preview-3569042f0
@metamask-previews/messenger@1.2.0-preview-3569042f0
@metamask-previews/messenger-cli@0.2.0-preview-3569042f0
@metamask-previews/money-account-balance-service@1.0.0-preview-3569042f0
@metamask-previews/money-account-controller@0.3.0-preview-3569042f0
@metamask-previews/money-account-upgrade-controller@1.3.1-preview-3569042f0
@metamask-previews/multichain-account-service@9.0.0-preview-3569042f0
@metamask-previews/multichain-api-middleware@3.1.0-preview-3569042f0
@metamask-previews/multichain-network-controller@3.1.0-preview-3569042f0
@metamask-previews/multichain-transactions-controller@7.1.0-preview-3569042f0
@metamask-previews/name-controller@9.1.1-preview-3569042f0
@metamask-previews/network-controller@30.1.0-preview-3569042f0
@metamask-previews/network-enablement-controller@5.1.0-preview-3569042f0
@metamask-previews/notification-services-controller@23.1.0-preview-3569042f0
@metamask-previews/passkey-controller@2.0.1-preview-3569042f0
@metamask-previews/permission-controller@13.1.0-preview-3569042f0
@metamask-previews/permission-log-controller@5.1.0-preview-3569042f0
@metamask-previews/perps-controller@6.0.0-preview-3569042f0
@metamask-previews/phishing-controller@17.1.1-preview-3569042f0
@metamask-previews/polling-controller@16.0.4-preview-3569042f0
@metamask-previews/preferences-controller@23.1.0-preview-3569042f0
@metamask-previews/profile-metrics-controller@3.1.3-preview-3569042f0
@metamask-previews/profile-sync-controller@28.0.2-preview-3569042f0
@metamask-previews/ramps-controller@13.3.0-preview-3569042f0
@metamask-previews/rate-limit-controller@7.0.1-preview-3569042f0
@metamask-previews/react-data-query@0.2.0-preview-3569042f0
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-3569042f0
@metamask-previews/sample-controllers@4.0.4-preview-3569042f0
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-3569042f0
@metamask-previews/selected-network-controller@26.1.1-preview-3569042f0
@metamask-previews/shield-controller@5.1.1-preview-3569042f0
@metamask-previews/signature-controller@39.2.0-preview-3569042f0
@metamask-previews/snap-account-service@0.0.0-preview-3569042f0
@metamask-previews/social-controllers@2.2.0-preview-3569042f0
@metamask-previews/storage-service@1.0.1-preview-3569042f0
@metamask-previews/subscription-controller@6.1.2-preview-3569042f0
@metamask-previews/transaction-controller@65.2.0-preview-3569042f0
@metamask-previews/transaction-pay-controller@22.1.0-preview-3569042f0
@metamask-previews/user-operation-controller@41.2.0-preview-3569042f0

@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-181ae75e1
@metamask-previews/accounts-controller@38.0.0-preview-181ae75e1
@metamask-previews/address-book-controller@7.1.1-preview-181ae75e1
@metamask-previews/ai-controllers@0.6.3-preview-181ae75e1
@metamask-previews/analytics-controller@1.0.1-preview-181ae75e1
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-181ae75e1
@metamask-previews/announcement-controller@8.1.0-preview-181ae75e1
@metamask-previews/app-metadata-controller@2.0.1-preview-181ae75e1
@metamask-previews/approval-controller@9.0.1-preview-181ae75e1
@metamask-previews/assets-controller@7.0.0-preview-181ae75e1
@metamask-previews/assets-controllers@106.0.0-preview-181ae75e1
@metamask-previews/authenticated-user-storage@1.0.0-preview-181ae75e1
@metamask-previews/base-controller@9.1.0-preview-181ae75e1
@metamask-previews/base-data-service@0.1.1-preview-181ae75e1
@metamask-previews/bridge-controller@72.0.1-preview-181ae75e1
@metamask-previews/bridge-status-controller@71.1.1-preview-181ae75e1
@metamask-previews/build-utils@3.0.4-preview-181ae75e1
@metamask-previews/chain-agnostic-permission@1.6.0-preview-181ae75e1
@metamask-previews/chomp-api-service@3.0.0-preview-181ae75e1
@metamask-previews/claims-controller@0.5.0-preview-181ae75e1
@metamask-previews/client-controller@1.0.1-preview-181ae75e1
@metamask-previews/compliance-controller@2.0.0-preview-181ae75e1
@metamask-previews/composable-controller@12.0.1-preview-181ae75e1
@metamask-previews/config-registry-controller@0.3.0-preview-181ae75e1
@metamask-previews/connectivity-controller@0.2.0-preview-181ae75e1
@metamask-previews/controller-utils@11.20.0-preview-181ae75e1
@metamask-previews/core-backend@6.2.1-preview-181ae75e1
@metamask-previews/delegation-controller@3.0.0-preview-181ae75e1
@metamask-previews/earn-controller@12.1.0-preview-181ae75e1
@metamask-previews/eip-5792-middleware@3.0.3-preview-181ae75e1
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-181ae75e1
@metamask-previews/eip1193-permission-middleware@2.0.0-preview-181ae75e1
@metamask-previews/ens-controller@19.1.1-preview-181ae75e1
@metamask-previews/eth-block-tracker@15.0.1-preview-181ae75e1
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-181ae75e1
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-181ae75e1
@metamask-previews/foundryup@1.0.1-preview-181ae75e1
@metamask-previews/gas-fee-controller@26.2.0-preview-181ae75e1
@metamask-previews/gator-permissions-controller@4.1.0-preview-181ae75e1
@metamask-previews/geolocation-controller@0.1.2-preview-181ae75e1
@metamask-previews/json-rpc-engine@10.5.0-preview-181ae75e1
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-181ae75e1
@metamask-previews/keyring-controller@25.5.0-preview-181ae75e1
@metamask-previews/logging-controller@8.0.1-preview-181ae75e1
@metamask-previews/message-manager@14.1.1-preview-181ae75e1
@metamask-previews/messenger@1.2.0-preview-181ae75e1
@metamask-previews/messenger-cli@0.2.0-preview-181ae75e1
@metamask-previews/money-account-balance-service@1.0.0-preview-181ae75e1
@metamask-previews/money-account-controller@0.3.0-preview-181ae75e1
@metamask-previews/money-account-upgrade-controller@1.3.1-preview-181ae75e1
@metamask-previews/multichain-account-service@9.0.0-preview-181ae75e1
@metamask-previews/multichain-api-middleware@3.1.0-preview-181ae75e1
@metamask-previews/multichain-network-controller@3.1.0-preview-181ae75e1
@metamask-previews/multichain-transactions-controller@7.1.0-preview-181ae75e1
@metamask-previews/name-controller@9.1.1-preview-181ae75e1
@metamask-previews/network-controller@30.1.0-preview-181ae75e1
@metamask-previews/network-enablement-controller@5.1.0-preview-181ae75e1
@metamask-previews/notification-services-controller@23.1.0-preview-181ae75e1
@metamask-previews/passkey-controller@2.0.1-preview-181ae75e1
@metamask-previews/permission-controller@13.1.0-preview-181ae75e1
@metamask-previews/permission-log-controller@5.1.0-preview-181ae75e1
@metamask-previews/perps-controller@6.0.0-preview-181ae75e1
@metamask-previews/phishing-controller@17.1.1-preview-181ae75e1
@metamask-previews/polling-controller@16.0.4-preview-181ae75e1
@metamask-previews/preferences-controller@23.1.0-preview-181ae75e1
@metamask-previews/profile-metrics-controller@3.1.3-preview-181ae75e1
@metamask-previews/profile-sync-controller@28.0.2-preview-181ae75e1
@metamask-previews/ramps-controller@13.3.0-preview-181ae75e1
@metamask-previews/rate-limit-controller@7.0.1-preview-181ae75e1
@metamask-previews/react-data-query@0.2.0-preview-181ae75e1
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-181ae75e1
@metamask-previews/sample-controllers@4.0.4-preview-181ae75e1
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-181ae75e1
@metamask-previews/selected-network-controller@26.1.1-preview-181ae75e1
@metamask-previews/shield-controller@5.1.1-preview-181ae75e1
@metamask-previews/signature-controller@39.2.0-preview-181ae75e1
@metamask-previews/snap-account-service@0.0.0-preview-181ae75e1
@metamask-previews/social-controllers@2.2.0-preview-181ae75e1
@metamask-previews/storage-service@1.0.1-preview-181ae75e1
@metamask-previews/subscription-controller@6.1.2-preview-181ae75e1
@metamask-previews/transaction-controller@65.2.0-preview-181ae75e1
@metamask-previews/transaction-pay-controller@22.1.0-preview-181ae75e1
@metamask-previews/user-operation-controller@41.2.0-preview-181ae75e1

@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-f3d53de3e
@metamask-previews/accounts-controller@38.1.0-preview-f3d53de3e
@metamask-previews/address-book-controller@7.1.2-preview-f3d53de3e
@metamask-previews/ai-controllers@0.6.3-preview-f3d53de3e
@metamask-previews/analytics-controller@1.0.1-preview-f3d53de3e
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-f3d53de3e
@metamask-previews/announcement-controller@8.1.0-preview-f3d53de3e
@metamask-previews/app-metadata-controller@2.0.1-preview-f3d53de3e
@metamask-previews/approval-controller@9.0.1-preview-f3d53de3e
@metamask-previews/assets-controller@7.0.1-preview-f3d53de3e
@metamask-previews/assets-controllers@106.0.1-preview-f3d53de3e
@metamask-previews/authenticated-user-storage@1.0.1-preview-f3d53de3e
@metamask-previews/base-controller@9.1.0-preview-f3d53de3e
@metamask-previews/base-data-service@0.1.2-preview-f3d53de3e
@metamask-previews/bridge-controller@72.0.2-preview-f3d53de3e
@metamask-previews/bridge-status-controller@71.1.2-preview-f3d53de3e
@metamask-previews/build-utils@3.0.4-preview-f3d53de3e
@metamask-previews/chain-agnostic-permission@1.6.1-preview-f3d53de3e
@metamask-previews/chomp-api-service@3.0.1-preview-f3d53de3e
@metamask-previews/claims-controller@0.5.1-preview-f3d53de3e
@metamask-previews/client-controller@1.0.1-preview-f3d53de3e
@metamask-previews/compliance-controller@2.0.1-preview-f3d53de3e
@metamask-previews/composable-controller@12.0.1-preview-f3d53de3e
@metamask-previews/config-registry-controller@0.3.1-preview-f3d53de3e
@metamask-previews/connectivity-controller@0.2.0-preview-f3d53de3e
@metamask-previews/controller-utils@12.0.0-preview-f3d53de3e
@metamask-previews/core-backend@6.2.2-preview-f3d53de3e
@metamask-previews/delegation-controller@3.0.0-preview-f3d53de3e
@metamask-previews/earn-controller@12.1.1-preview-f3d53de3e
@metamask-previews/eip-5792-middleware@3.0.3-preview-f3d53de3e
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-f3d53de3e
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-f3d53de3e
@metamask-previews/ens-controller@19.1.2-preview-f3d53de3e
@metamask-previews/eth-block-tracker@15.0.1-preview-f3d53de3e
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-f3d53de3e
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-f3d53de3e
@metamask-previews/foundryup@1.0.1-preview-f3d53de3e
@metamask-previews/gas-fee-controller@26.2.1-preview-f3d53de3e
@metamask-previews/gator-permissions-controller@4.1.1-preview-f3d53de3e
@metamask-previews/geolocation-controller@0.1.3-preview-f3d53de3e
@metamask-previews/json-rpc-engine@10.5.0-preview-f3d53de3e
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-f3d53de3e
@metamask-previews/keyring-controller@25.5.0-preview-f3d53de3e
@metamask-previews/logging-controller@8.0.2-preview-f3d53de3e
@metamask-previews/message-manager@14.1.2-preview-f3d53de3e
@metamask-previews/messenger@1.2.0-preview-f3d53de3e
@metamask-previews/messenger-cli@0.2.0-preview-f3d53de3e
@metamask-previews/money-account-balance-service@1.0.1-preview-f3d53de3e
@metamask-previews/money-account-controller@0.3.0-preview-f3d53de3e
@metamask-previews/money-account-upgrade-controller@1.3.2-preview-f3d53de3e
@metamask-previews/multichain-account-service@9.0.0-preview-f3d53de3e
@metamask-previews/multichain-api-middleware@3.1.1-preview-f3d53de3e
@metamask-previews/multichain-network-controller@3.1.1-preview-f3d53de3e
@metamask-previews/multichain-transactions-controller@7.1.0-preview-f3d53de3e
@metamask-previews/name-controller@9.1.2-preview-f3d53de3e
@metamask-previews/network-controller@31.0.0-preview-f3d53de3e
@metamask-previews/network-enablement-controller@5.1.1-preview-f3d53de3e
@metamask-previews/notification-services-controller@23.1.1-preview-f3d53de3e
@metamask-previews/passkey-controller@2.0.1-preview-f3d53de3e
@metamask-previews/permission-controller@13.1.1-preview-f3d53de3e
@metamask-previews/permission-log-controller@5.1.0-preview-f3d53de3e
@metamask-previews/perps-controller@6.0.1-preview-f3d53de3e
@metamask-previews/phishing-controller@17.1.2-preview-f3d53de3e
@metamask-previews/polling-controller@16.0.5-preview-f3d53de3e
@metamask-previews/preferences-controller@23.1.0-preview-f3d53de3e
@metamask-previews/profile-metrics-controller@3.1.4-preview-f3d53de3e
@metamask-previews/profile-sync-controller@28.0.2-preview-f3d53de3e
@metamask-previews/ramps-controller@13.3.1-preview-f3d53de3e
@metamask-previews/rate-limit-controller@7.0.1-preview-f3d53de3e
@metamask-previews/react-data-query@0.2.0-preview-f3d53de3e
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-f3d53de3e
@metamask-previews/sample-controllers@5.0.0-preview-f3d53de3e
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-f3d53de3e
@metamask-previews/selected-network-controller@26.1.2-preview-f3d53de3e
@metamask-previews/shield-controller@5.1.2-preview-f3d53de3e
@metamask-previews/signature-controller@39.2.1-preview-f3d53de3e
@metamask-previews/snap-account-service@0.0.0-preview-f3d53de3e
@metamask-previews/social-controllers@2.2.1-preview-f3d53de3e
@metamask-previews/storage-service@1.0.1-preview-f3d53de3e
@metamask-previews/subscription-controller@6.1.3-preview-f3d53de3e
@metamask-previews/transaction-controller@65.3.0-preview-f3d53de3e
@metamask-previews/transaction-pay-controller@22.2.0-preview-f3d53de3e
@metamask-previews/user-operation-controller@41.2.1-preview-f3d53de3e

@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-1f601d6f4
@metamask-previews/accounts-controller@38.1.0-preview-1f601d6f4
@metamask-previews/address-book-controller@7.1.2-preview-1f601d6f4
@metamask-previews/ai-controllers@0.6.3-preview-1f601d6f4
@metamask-previews/analytics-controller@1.0.1-preview-1f601d6f4
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-1f601d6f4
@metamask-previews/announcement-controller@8.1.0-preview-1f601d6f4
@metamask-previews/app-metadata-controller@2.0.1-preview-1f601d6f4
@metamask-previews/approval-controller@9.0.1-preview-1f601d6f4
@metamask-previews/assets-controller@7.0.1-preview-1f601d6f4
@metamask-previews/assets-controllers@106.0.1-preview-1f601d6f4
@metamask-previews/authenticated-user-storage@1.0.1-preview-1f601d6f4
@metamask-previews/base-controller@9.1.0-preview-1f601d6f4
@metamask-previews/base-data-service@0.1.2-preview-1f601d6f4
@metamask-previews/bridge-controller@72.0.2-preview-1f601d6f4
@metamask-previews/bridge-status-controller@71.1.2-preview-1f601d6f4
@metamask-previews/build-utils@3.0.4-preview-1f601d6f4
@metamask-previews/chain-agnostic-permission@1.6.1-preview-1f601d6f4
@metamask-previews/chomp-api-service@3.0.1-preview-1f601d6f4
@metamask-previews/claims-controller@0.5.1-preview-1f601d6f4
@metamask-previews/client-controller@1.0.1-preview-1f601d6f4
@metamask-previews/compliance-controller@2.0.1-preview-1f601d6f4
@metamask-previews/composable-controller@12.0.1-preview-1f601d6f4
@metamask-previews/config-registry-controller@0.3.1-preview-1f601d6f4
@metamask-previews/connectivity-controller@0.2.0-preview-1f601d6f4
@metamask-previews/controller-utils@12.0.0-preview-1f601d6f4
@metamask-previews/core-backend@6.2.2-preview-1f601d6f4
@metamask-previews/delegation-controller@3.0.0-preview-1f601d6f4
@metamask-previews/earn-controller@12.1.1-preview-1f601d6f4
@metamask-previews/eip-5792-middleware@3.0.3-preview-1f601d6f4
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-1f601d6f4
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-1f601d6f4
@metamask-previews/ens-controller@19.1.2-preview-1f601d6f4
@metamask-previews/eth-block-tracker@15.0.1-preview-1f601d6f4
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-1f601d6f4
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-1f601d6f4
@metamask-previews/foundryup@1.0.1-preview-1f601d6f4
@metamask-previews/gas-fee-controller@26.2.1-preview-1f601d6f4
@metamask-previews/gator-permissions-controller@4.1.1-preview-1f601d6f4
@metamask-previews/geolocation-controller@0.1.3-preview-1f601d6f4
@metamask-previews/json-rpc-engine@10.5.0-preview-1f601d6f4
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-1f601d6f4
@metamask-previews/keyring-controller@25.5.0-preview-1f601d6f4
@metamask-previews/logging-controller@8.0.2-preview-1f601d6f4
@metamask-previews/message-manager@14.1.2-preview-1f601d6f4
@metamask-previews/messenger@1.2.0-preview-1f601d6f4
@metamask-previews/messenger-cli@0.2.0-preview-1f601d6f4
@metamask-previews/money-account-balance-service@1.0.1-preview-1f601d6f4
@metamask-previews/money-account-controller@0.3.0-preview-1f601d6f4
@metamask-previews/money-account-upgrade-controller@1.3.2-preview-1f601d6f4
@metamask-previews/multichain-account-service@9.0.0-preview-1f601d6f4
@metamask-previews/multichain-api-middleware@3.1.1-preview-1f601d6f4
@metamask-previews/multichain-network-controller@3.1.1-preview-1f601d6f4
@metamask-previews/multichain-transactions-controller@7.1.0-preview-1f601d6f4
@metamask-previews/name-controller@9.1.2-preview-1f601d6f4
@metamask-previews/network-controller@31.0.0-preview-1f601d6f4
@metamask-previews/network-enablement-controller@5.1.1-preview-1f601d6f4
@metamask-previews/notification-services-controller@23.1.1-preview-1f601d6f4
@metamask-previews/passkey-controller@2.0.1-preview-1f601d6f4
@metamask-previews/permission-controller@13.1.1-preview-1f601d6f4
@metamask-previews/permission-log-controller@5.1.0-preview-1f601d6f4
@metamask-previews/perps-controller@6.0.1-preview-1f601d6f4
@metamask-previews/phishing-controller@17.1.2-preview-1f601d6f4
@metamask-previews/polling-controller@16.0.5-preview-1f601d6f4
@metamask-previews/preferences-controller@23.1.0-preview-1f601d6f4
@metamask-previews/profile-metrics-controller@3.1.4-preview-1f601d6f4
@metamask-previews/profile-sync-controller@28.0.2-preview-1f601d6f4
@metamask-previews/ramps-controller@13.3.1-preview-1f601d6f4
@metamask-previews/rate-limit-controller@7.0.1-preview-1f601d6f4
@metamask-previews/react-data-query@0.2.0-preview-1f601d6f4
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-1f601d6f4
@metamask-previews/sample-controllers@5.0.0-preview-1f601d6f4
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-1f601d6f4
@metamask-previews/selected-network-controller@26.1.2-preview-1f601d6f4
@metamask-previews/shield-controller@5.1.2-preview-1f601d6f4
@metamask-previews/signature-controller@39.2.1-preview-1f601d6f4
@metamask-previews/snap-account-service@0.0.0-preview-1f601d6f4
@metamask-previews/social-controllers@2.2.1-preview-1f601d6f4
@metamask-previews/storage-service@1.0.1-preview-1f601d6f4
@metamask-previews/subscription-controller@6.1.3-preview-1f601d6f4
@metamask-previews/transaction-controller@65.3.0-preview-1f601d6f4
@metamask-previews/transaction-pay-controller@22.2.0-preview-1f601d6f4
@metamask-previews/user-operation-controller@41.2.1-preview-1f601d6f4

@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-510d33d51
@metamask-previews/accounts-controller@38.1.0-preview-510d33d51
@metamask-previews/address-book-controller@7.1.2-preview-510d33d51
@metamask-previews/ai-controllers@0.6.3-preview-510d33d51
@metamask-previews/analytics-controller@1.0.1-preview-510d33d51
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-510d33d51
@metamask-previews/announcement-controller@8.1.0-preview-510d33d51
@metamask-previews/app-metadata-controller@2.0.1-preview-510d33d51
@metamask-previews/approval-controller@9.0.1-preview-510d33d51
@metamask-previews/assets-controller@7.0.1-preview-510d33d51
@metamask-previews/assets-controllers@106.0.1-preview-510d33d51
@metamask-previews/authenticated-user-storage@1.0.1-preview-510d33d51
@metamask-previews/base-controller@9.1.0-preview-510d33d51
@metamask-previews/base-data-service@0.1.2-preview-510d33d51
@metamask-previews/bridge-controller@72.0.2-preview-510d33d51
@metamask-previews/bridge-status-controller@71.1.2-preview-510d33d51
@metamask-previews/build-utils@3.0.4-preview-510d33d51
@metamask-previews/chain-agnostic-permission@1.6.1-preview-510d33d51
@metamask-previews/chomp-api-service@3.0.1-preview-510d33d51
@metamask-previews/claims-controller@0.5.1-preview-510d33d51
@metamask-previews/client-controller@1.0.1-preview-510d33d51
@metamask-previews/compliance-controller@2.0.1-preview-510d33d51
@metamask-previews/composable-controller@12.0.1-preview-510d33d51
@metamask-previews/config-registry-controller@0.3.1-preview-510d33d51
@metamask-previews/connectivity-controller@0.2.0-preview-510d33d51
@metamask-previews/controller-utils@12.0.0-preview-510d33d51
@metamask-previews/core-backend@6.2.2-preview-510d33d51
@metamask-previews/delegation-controller@3.0.0-preview-510d33d51
@metamask-previews/earn-controller@12.1.1-preview-510d33d51
@metamask-previews/eip-5792-middleware@3.0.3-preview-510d33d51
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-510d33d51
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-510d33d51
@metamask-previews/ens-controller@19.1.2-preview-510d33d51
@metamask-previews/eth-block-tracker@15.0.1-preview-510d33d51
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-510d33d51
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-510d33d51
@metamask-previews/foundryup@1.0.1-preview-510d33d51
@metamask-previews/gas-fee-controller@26.2.1-preview-510d33d51
@metamask-previews/gator-permissions-controller@4.1.1-preview-510d33d51
@metamask-previews/geolocation-controller@0.1.3-preview-510d33d51
@metamask-previews/json-rpc-engine@10.5.0-preview-510d33d51
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-510d33d51
@metamask-previews/keyring-controller@25.5.0-preview-510d33d51
@metamask-previews/logging-controller@8.0.2-preview-510d33d51
@metamask-previews/message-manager@14.1.2-preview-510d33d51
@metamask-previews/messenger@1.2.0-preview-510d33d51
@metamask-previews/messenger-cli@0.2.0-preview-510d33d51
@metamask-previews/money-account-balance-service@1.0.1-preview-510d33d51
@metamask-previews/money-account-controller@0.3.0-preview-510d33d51
@metamask-previews/money-account-upgrade-controller@1.3.2-preview-510d33d51
@metamask-previews/multichain-account-service@9.0.0-preview-510d33d51
@metamask-previews/multichain-api-middleware@3.1.1-preview-510d33d51
@metamask-previews/multichain-network-controller@3.1.1-preview-510d33d51
@metamask-previews/multichain-transactions-controller@7.1.0-preview-510d33d51
@metamask-previews/name-controller@9.1.2-preview-510d33d51
@metamask-previews/network-controller@31.0.0-preview-510d33d51
@metamask-previews/network-enablement-controller@5.1.1-preview-510d33d51
@metamask-previews/notification-services-controller@23.1.1-preview-510d33d51
@metamask-previews/passkey-controller@2.0.1-preview-510d33d51
@metamask-previews/permission-controller@13.1.1-preview-510d33d51
@metamask-previews/permission-log-controller@5.1.0-preview-510d33d51
@metamask-previews/perps-controller@6.0.1-preview-510d33d51
@metamask-previews/phishing-controller@17.1.2-preview-510d33d51
@metamask-previews/polling-controller@16.0.5-preview-510d33d51
@metamask-previews/preferences-controller@23.1.0-preview-510d33d51
@metamask-previews/profile-metrics-controller@3.1.4-preview-510d33d51
@metamask-previews/profile-sync-controller@28.0.2-preview-510d33d51
@metamask-previews/ramps-controller@13.3.1-preview-510d33d51
@metamask-previews/rate-limit-controller@7.0.1-preview-510d33d51
@metamask-previews/react-data-query@0.2.0-preview-510d33d51
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-510d33d51
@metamask-previews/sample-controllers@5.0.0-preview-510d33d51
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-510d33d51
@metamask-previews/selected-network-controller@26.1.2-preview-510d33d51
@metamask-previews/shield-controller@5.1.2-preview-510d33d51
@metamask-previews/signature-controller@39.2.1-preview-510d33d51
@metamask-previews/snap-account-service@0.0.0-preview-510d33d51
@metamask-previews/social-controllers@2.2.1-preview-510d33d51
@metamask-previews/storage-service@1.0.1-preview-510d33d51
@metamask-previews/subscription-controller@6.1.3-preview-510d33d51
@metamask-previews/transaction-controller@65.3.0-preview-510d33d51
@metamask-previews/transaction-pay-controller@22.2.0-preview-510d33d51
@metamask-previews/user-operation-controller@41.2.1-preview-510d33d51

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-c7e584108
@metamask-previews/accounts-controller@38.1.0-preview-c7e584108
@metamask-previews/address-book-controller@7.1.2-preview-c7e584108
@metamask-previews/ai-controllers@0.6.3-preview-c7e584108
@metamask-previews/analytics-controller@1.0.1-preview-c7e584108
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-c7e584108
@metamask-previews/announcement-controller@8.1.0-preview-c7e584108
@metamask-previews/app-metadata-controller@2.0.1-preview-c7e584108
@metamask-previews/approval-controller@9.0.1-preview-c7e584108
@metamask-previews/assets-controller@7.0.1-preview-c7e584108
@metamask-previews/assets-controllers@106.0.1-preview-c7e584108
@metamask-previews/authenticated-user-storage@1.0.1-preview-c7e584108
@metamask-previews/base-controller@9.1.0-preview-c7e584108
@metamask-previews/base-data-service@0.1.2-preview-c7e584108
@metamask-previews/bridge-controller@72.0.2-preview-c7e584108
@metamask-previews/bridge-status-controller@71.1.2-preview-c7e584108
@metamask-previews/build-utils@3.0.4-preview-c7e584108
@metamask-previews/chain-agnostic-permission@1.6.1-preview-c7e584108
@metamask-previews/chomp-api-service@3.0.1-preview-c7e584108
@metamask-previews/claims-controller@0.5.1-preview-c7e584108
@metamask-previews/client-controller@1.0.1-preview-c7e584108
@metamask-previews/compliance-controller@2.0.1-preview-c7e584108
@metamask-previews/composable-controller@12.0.1-preview-c7e584108
@metamask-previews/config-registry-controller@0.3.1-preview-c7e584108
@metamask-previews/connectivity-controller@0.2.0-preview-c7e584108
@metamask-previews/controller-utils@12.0.0-preview-c7e584108
@metamask-previews/core-backend@6.2.2-preview-c7e584108
@metamask-previews/delegation-controller@3.0.0-preview-c7e584108
@metamask-previews/earn-controller@12.1.1-preview-c7e584108
@metamask-previews/eip-5792-middleware@3.0.3-preview-c7e584108
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-c7e584108
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-c7e584108
@metamask-previews/ens-controller@19.1.2-preview-c7e584108
@metamask-previews/eth-block-tracker@15.0.1-preview-c7e584108
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-c7e584108
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-c7e584108
@metamask-previews/foundryup@1.0.1-preview-c7e584108
@metamask-previews/gas-fee-controller@26.2.1-preview-c7e584108
@metamask-previews/gator-permissions-controller@4.1.1-preview-c7e584108
@metamask-previews/geolocation-controller@0.1.3-preview-c7e584108
@metamask-previews/json-rpc-engine@10.5.0-preview-c7e584108
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-c7e584108
@metamask-previews/keyring-controller@25.5.0-preview-c7e584108
@metamask-previews/logging-controller@8.0.2-preview-c7e584108
@metamask-previews/message-manager@14.1.2-preview-c7e584108
@metamask-previews/messenger@1.2.0-preview-c7e584108
@metamask-previews/messenger-cli@0.2.0-preview-c7e584108
@metamask-previews/money-account-balance-service@1.0.1-preview-c7e584108
@metamask-previews/money-account-controller@0.3.0-preview-c7e584108
@metamask-previews/money-account-upgrade-controller@1.3.2-preview-c7e584108
@metamask-previews/multichain-account-service@9.0.0-preview-c7e584108
@metamask-previews/multichain-api-middleware@3.1.1-preview-c7e584108
@metamask-previews/multichain-network-controller@3.1.1-preview-c7e584108
@metamask-previews/multichain-transactions-controller@7.1.0-preview-c7e584108
@metamask-previews/name-controller@9.1.2-preview-c7e584108
@metamask-previews/network-controller@31.0.0-preview-c7e584108
@metamask-previews/network-enablement-controller@5.1.1-preview-c7e584108
@metamask-previews/notification-services-controller@23.1.1-preview-c7e584108
@metamask-previews/passkey-controller@2.0.1-preview-c7e584108
@metamask-previews/permission-controller@13.1.1-preview-c7e584108
@metamask-previews/permission-log-controller@5.1.0-preview-c7e584108
@metamask-previews/perps-controller@6.0.1-preview-c7e584108
@metamask-previews/phishing-controller@17.1.2-preview-c7e584108
@metamask-previews/polling-controller@16.0.5-preview-c7e584108
@metamask-previews/preferences-controller@23.1.0-preview-c7e584108
@metamask-previews/profile-metrics-controller@3.1.4-preview-c7e584108
@metamask-previews/profile-sync-controller@28.0.2-preview-c7e584108
@metamask-previews/ramps-controller@13.3.1-preview-c7e584108
@metamask-previews/rate-limit-controller@7.0.1-preview-c7e584108
@metamask-previews/react-data-query@0.2.0-preview-c7e584108
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-c7e584108
@metamask-previews/sample-controllers@5.0.0-preview-c7e584108
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-c7e584108
@metamask-previews/selected-network-controller@26.1.2-preview-c7e584108
@metamask-previews/shield-controller@5.1.2-preview-c7e584108
@metamask-previews/signature-controller@39.2.1-preview-c7e584108
@metamask-previews/snap-account-service@0.0.0-preview-c7e584108
@metamask-previews/social-controllers@2.2.1-preview-c7e584108
@metamask-previews/storage-service@1.0.1-preview-c7e584108
@metamask-previews/subscription-controller@6.1.3-preview-c7e584108
@metamask-previews/transaction-controller@65.3.0-preview-c7e584108
@metamask-previews/transaction-pay-controller@22.2.0-preview-c7e584108
@metamask-previews/user-operation-controller@41.2.1-preview-c7e584108

Comment thread packages/core-backend/src/ws/ohlcv/OHLCVService.ts
Comment thread packages/core-backend/src/ws/ohlcv/OHLCVService.ts
*/
async subscribe(options: OHLCVSubscriptionOptions): Promise<void> {
const channel = this.#buildChannel(options);
return this.#withChannelLock(channel, () => this.#subscribeInner(channel));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can use import { Mutex } from 'async-mutex'; its already used in other Controllers

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread packages/core-backend/src/ws/ohlcv/OHLCVService.ts
Comment thread packages/core-backend/src/ws/ohlcv/OHLCVService.ts Outdated
@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 337abd9. Configure here.

Comment thread packages/core-backend/src/ws/ohlcv/OHLCVService.ts
@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-337abd924
@metamask-previews/accounts-controller@38.1.1-preview-337abd924
@metamask-previews/address-book-controller@7.1.2-preview-337abd924
@metamask-previews/ai-controllers@0.6.3-preview-337abd924
@metamask-previews/analytics-controller@1.0.1-preview-337abd924
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-337abd924
@metamask-previews/announcement-controller@8.1.0-preview-337abd924
@metamask-previews/app-metadata-controller@2.0.1-preview-337abd924
@metamask-previews/approval-controller@9.0.1-preview-337abd924
@metamask-previews/assets-controller@7.1.1-preview-337abd924
@metamask-previews/assets-controllers@108.0.0-preview-337abd924
@metamask-previews/authenticated-user-storage@1.0.1-preview-337abd924
@metamask-previews/base-controller@9.1.0-preview-337abd924
@metamask-previews/base-data-service@0.1.2-preview-337abd924
@metamask-previews/bridge-controller@72.0.4-preview-337abd924
@metamask-previews/bridge-status-controller@71.1.4-preview-337abd924
@metamask-previews/build-utils@3.0.4-preview-337abd924
@metamask-previews/chain-agnostic-permission@1.6.1-preview-337abd924
@metamask-previews/chomp-api-service@3.1.0-preview-337abd924
@metamask-previews/claims-controller@0.5.1-preview-337abd924
@metamask-previews/client-controller@1.0.1-preview-337abd924
@metamask-previews/compliance-controller@2.0.1-preview-337abd924
@metamask-previews/composable-controller@12.0.1-preview-337abd924
@metamask-previews/config-registry-controller@0.3.1-preview-337abd924
@metamask-previews/connectivity-controller@0.2.0-preview-337abd924
@metamask-previews/controller-utils@12.1.0-preview-337abd924
@metamask-previews/core-backend@6.2.2-preview-337abd924
@metamask-previews/delegation-controller@3.0.0-preview-337abd924
@metamask-previews/earn-controller@12.1.2-preview-337abd924
@metamask-previews/eip-5792-middleware@3.0.3-preview-337abd924
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-337abd924
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-337abd924
@metamask-previews/ens-controller@19.1.3-preview-337abd924
@metamask-previews/eth-block-tracker@15.0.1-preview-337abd924
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-337abd924
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-337abd924
@metamask-previews/foundryup@1.0.1-preview-337abd924
@metamask-previews/gas-fee-controller@26.2.1-preview-337abd924
@metamask-previews/gator-permissions-controller@4.1.2-preview-337abd924
@metamask-previews/geolocation-controller@0.1.3-preview-337abd924
@metamask-previews/json-rpc-engine@10.5.0-preview-337abd924
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-337abd924
@metamask-previews/keyring-controller@25.5.0-preview-337abd924
@metamask-previews/logging-controller@8.0.2-preview-337abd924
@metamask-previews/message-manager@14.1.2-preview-337abd924
@metamask-previews/messenger@1.2.0-preview-337abd924
@metamask-previews/messenger-cli@0.2.0-preview-337abd924
@metamask-previews/money-account-balance-service@1.0.2-preview-337abd924
@metamask-previews/money-account-controller@0.3.0-preview-337abd924
@metamask-previews/money-account-upgrade-controller@2.0.1-preview-337abd924
@metamask-previews/multichain-account-service@9.0.0-preview-337abd924
@metamask-previews/multichain-api-middleware@3.1.2-preview-337abd924
@metamask-previews/multichain-network-controller@3.1.1-preview-337abd924
@metamask-previews/multichain-transactions-controller@7.1.0-preview-337abd924
@metamask-previews/name-controller@9.1.2-preview-337abd924
@metamask-previews/network-controller@32.0.0-preview-337abd924
@metamask-previews/network-enablement-controller@5.1.1-preview-337abd924
@metamask-previews/notification-services-controller@23.1.1-preview-337abd924
@metamask-previews/passkey-controller@2.0.1-preview-337abd924
@metamask-previews/permission-controller@13.1.1-preview-337abd924
@metamask-previews/permission-log-controller@5.1.0-preview-337abd924
@metamask-previews/perps-controller@6.0.1-preview-337abd924
@metamask-previews/phishing-controller@17.1.2-preview-337abd924
@metamask-previews/polling-controller@16.0.5-preview-337abd924
@metamask-previews/preferences-controller@23.1.0-preview-337abd924
@metamask-previews/profile-metrics-controller@3.1.4-preview-337abd924
@metamask-previews/profile-sync-controller@28.0.2-preview-337abd924
@metamask-previews/ramps-controller@13.3.1-preview-337abd924
@metamask-previews/rate-limit-controller@7.0.1-preview-337abd924
@metamask-previews/react-data-query@0.2.0-preview-337abd924
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-337abd924
@metamask-previews/sample-controllers@5.0.1-preview-337abd924
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-337abd924
@metamask-previews/selected-network-controller@26.1.3-preview-337abd924
@metamask-previews/shield-controller@5.1.2-preview-337abd924
@metamask-previews/signature-controller@39.2.2-preview-337abd924
@metamask-previews/snap-account-service@0.0.0-preview-337abd924
@metamask-previews/social-controllers@2.2.1-preview-337abd924
@metamask-previews/storage-service@1.0.1-preview-337abd924
@metamask-previews/subscription-controller@6.1.3-preview-337abd924
@metamask-previews/transaction-controller@65.3.0-preview-337abd924
@metamask-previews/transaction-pay-controller@22.3.1-preview-337abd924
@metamask-previews/user-operation-controller@41.2.2-preview-337abd924

@sahar-fehri
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.3.0-preview-150787a7d
@metamask-previews/accounts-controller@38.1.1-preview-150787a7d
@metamask-previews/address-book-controller@7.1.2-preview-150787a7d
@metamask-previews/ai-controllers@0.6.3-preview-150787a7d
@metamask-previews/analytics-controller@1.0.1-preview-150787a7d
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-150787a7d
@metamask-previews/announcement-controller@8.1.0-preview-150787a7d
@metamask-previews/app-metadata-controller@2.0.1-preview-150787a7d
@metamask-previews/approval-controller@9.0.1-preview-150787a7d
@metamask-previews/assets-controller@7.1.1-preview-150787a7d
@metamask-previews/assets-controllers@108.0.0-preview-150787a7d
@metamask-previews/authenticated-user-storage@1.0.1-preview-150787a7d
@metamask-previews/base-controller@9.1.0-preview-150787a7d
@metamask-previews/base-data-service@0.1.2-preview-150787a7d
@metamask-previews/bridge-controller@72.0.4-preview-150787a7d
@metamask-previews/bridge-status-controller@71.1.4-preview-150787a7d
@metamask-previews/build-utils@3.0.4-preview-150787a7d
@metamask-previews/chain-agnostic-permission@1.6.1-preview-150787a7d
@metamask-previews/chomp-api-service@3.1.0-preview-150787a7d
@metamask-previews/claims-controller@0.5.1-preview-150787a7d
@metamask-previews/client-controller@1.0.1-preview-150787a7d
@metamask-previews/compliance-controller@2.0.1-preview-150787a7d
@metamask-previews/composable-controller@12.0.1-preview-150787a7d
@metamask-previews/config-registry-controller@0.3.1-preview-150787a7d
@metamask-previews/connectivity-controller@0.2.0-preview-150787a7d
@metamask-previews/controller-utils@12.1.0-preview-150787a7d
@metamask-previews/core-backend@6.2.2-preview-150787a7d
@metamask-previews/delegation-controller@3.0.0-preview-150787a7d
@metamask-previews/earn-controller@12.1.2-preview-150787a7d
@metamask-previews/eip-5792-middleware@3.0.3-preview-150787a7d
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-150787a7d
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-150787a7d
@metamask-previews/ens-controller@19.1.3-preview-150787a7d
@metamask-previews/eth-block-tracker@15.0.1-preview-150787a7d
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-150787a7d
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-150787a7d
@metamask-previews/foundryup@1.0.1-preview-150787a7d
@metamask-previews/gas-fee-controller@26.2.1-preview-150787a7d
@metamask-previews/gator-permissions-controller@4.1.2-preview-150787a7d
@metamask-previews/geolocation-controller@0.1.3-preview-150787a7d
@metamask-previews/json-rpc-engine@10.5.0-preview-150787a7d
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-150787a7d
@metamask-previews/keyring-controller@25.5.0-preview-150787a7d
@metamask-previews/logging-controller@8.0.2-preview-150787a7d
@metamask-previews/message-manager@14.1.2-preview-150787a7d
@metamask-previews/messenger@1.2.0-preview-150787a7d
@metamask-previews/messenger-cli@0.2.0-preview-150787a7d
@metamask-previews/money-account-balance-service@1.0.2-preview-150787a7d
@metamask-previews/money-account-controller@0.3.0-preview-150787a7d
@metamask-previews/money-account-upgrade-controller@2.0.1-preview-150787a7d
@metamask-previews/multichain-account-service@9.0.0-preview-150787a7d
@metamask-previews/multichain-api-middleware@3.1.2-preview-150787a7d
@metamask-previews/multichain-network-controller@3.1.1-preview-150787a7d
@metamask-previews/multichain-transactions-controller@7.1.0-preview-150787a7d
@metamask-previews/name-controller@9.1.2-preview-150787a7d
@metamask-previews/network-controller@32.0.0-preview-150787a7d
@metamask-previews/network-enablement-controller@5.1.1-preview-150787a7d
@metamask-previews/notification-services-controller@23.1.1-preview-150787a7d
@metamask-previews/passkey-controller@2.0.1-preview-150787a7d
@metamask-previews/permission-controller@13.1.1-preview-150787a7d
@metamask-previews/permission-log-controller@5.1.0-preview-150787a7d
@metamask-previews/perps-controller@6.0.1-preview-150787a7d
@metamask-previews/phishing-controller@17.1.2-preview-150787a7d
@metamask-previews/polling-controller@16.0.5-preview-150787a7d
@metamask-previews/preferences-controller@23.1.0-preview-150787a7d
@metamask-previews/profile-metrics-controller@3.1.4-preview-150787a7d
@metamask-previews/profile-sync-controller@28.0.2-preview-150787a7d
@metamask-previews/ramps-controller@13.3.1-preview-150787a7d
@metamask-previews/rate-limit-controller@7.0.1-preview-150787a7d
@metamask-previews/react-data-query@0.2.0-preview-150787a7d
@metamask-previews/remote-feature-flag-controller@4.2.1-preview-150787a7d
@metamask-previews/sample-controllers@5.0.1-preview-150787a7d
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-150787a7d
@metamask-previews/selected-network-controller@26.1.3-preview-150787a7d
@metamask-previews/shield-controller@5.1.2-preview-150787a7d
@metamask-previews/signature-controller@39.2.2-preview-150787a7d
@metamask-previews/snap-account-service@0.0.0-preview-150787a7d
@metamask-previews/social-controllers@2.2.1-preview-150787a7d
@metamask-previews/storage-service@1.0.1-preview-150787a7d
@metamask-previews/subscription-controller@6.1.3-preview-150787a7d
@metamask-previews/transaction-controller@65.3.0-preview-150787a7d
@metamask-previews/transaction-pay-controller@22.3.1-preview-150787a7d
@metamask-previews/user-operation-controller@41.2.2-preview-150787a7d

Kriys94
Kriys94 previously approved these changes May 13, 2026
Copy link
Copy Markdown
Contributor

@Kriys94 Kriys94 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks a lot @sahar-fehri

@sahar-fehri sahar-fehri added this pull request to the merge queue May 13, 2026
Merged via the queue into main with commit 9a7858c May 13, 2026
366 checks passed
@sahar-fehri sahar-fehri deleted the chore/add-ohlcv-websocket branch May 13, 2026 14:02
pull Bot pushed a commit to Pe44e/metamask-mobile that referenced this pull request May 14, 2026
## **Description**

Related to:
https://www.notion.so/metamask-consensys/OHLCV-WebSocket-Integration-UI-Implementation-Guide-346f86d67d6880b6a70fc3be0f0c34b9

Wires `OHLCVService` from `@metamask/core-backend` into the Engine and
creates a `useOHLCVRealtime` hook that streams live candlestick updates
to the advanced chart via the existing `realtimeBar` prop on
`AdvancedChart`.

**Why:** The advanced chart currently only renders historical data
fetched via the REST OHLCV API. Users see stale candles until they
navigate away and back. Real-time streaming via WebSocket keeps the
chart live with 5-second heartbeat updates.

**How:** Follows the exact same Engine wiring pattern as
`AccountActivityService` — messenger, init function, Engine
registration. The new `useOHLCVRealtime` hook subscribes to
`OHLCVService:barUpdated` events, filters by channel, and converts the
WS bar format (timestamp in Unix seconds) to the chart's expected format
(time in milliseconds).


## Manual Test Plan

### Prerequisites

- MetaMask Mobile connected to a wallet with tokens
- `backendWebSocketConnection` feature flag enabled

### Adding console.log statements to the mobile hook

**1. Inside `handleBarUpdated`** — after the channel guard:

```ts
const handleBarUpdated = (payload: { channel: string; bar: WSOHLCVBar }) => {
  if (payload.channel === channelRef.current) {
    console.log(                                                        // ← ADD
      `[OHLCV-WS] Bar received — channel=${payload.channel}, close=${payload.bar.close}, ts=${payload.bar.timestamp}`,
    );
    lastMessageTimeRef.current = Date.now();
    ...
```

**2. Inside `handleSubscriptionError`** — first line of the callback:

```ts
const handleSubscriptionError = (payload: { channel: string; error: string; operation: string }) => {
  console.log(                                                          // ← ADD
    `[OHLCV-WS] Subscription error on ${payload.channel}: ${payload.error} (${payload.operation})`,
  );
};
```

**3. Inside `handleChainStatusChanged`** — after the `chainIds.includes`
guard:

```ts
if (payload.chainIds.includes(chainId)) {
  console.log(                                                          // ← ADD
    `[OHLCV-WS] Chain status changed — chainId=${chainId}, status=${payload.status}`,
  );
  chainDownRef.current = payload.status === 'down';
}
```

**4. Inside `pollLatest`** — first line of the function:

```ts
const pollLatest = async () => {
  pollingAbortRef.current?.abort();
  const controller = new AbortController();
  pollingAbortRef.current = controller;

  console.log('[OHLCV-WS] Polling /latest via REST fallback');          // ← ADD
  ...
```

**5. Inside the staleness `setInterval`** — when `isStale || chainDown`:

```ts
if (isStale || chainDownRef.current) {
  console.log(                                                          // ← ADD
    `[OHLCV-WS] Stream stale or chain down — isStale=${isStale}, chainDown=${chainDownRef.current}, elapsed=${elapsed}ms`,
  );
  pollLatest();
}
```

**6. Inside the debounce `setTimeout`** — first line:

```ts
debounceTimerRef.current = setTimeout(async () => {
  console.log(                                                          // ← ADD
    `[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for ${channel}`,
  );
  try {
    await Engine.controllerMessenger.call('OHLCVService:subscribe', { ... });
    ...
```

**7. In the cleanup `return` function** — first line:

```ts
return () => {
  console.log(                                                          // ← ADD
    `[OHLCV-WS] Cleanup — channel=${channel}, wasSubscribed=${subscribedRef.current}`,
  );
  cancelledRef.current = true;
  ...
```

### Enabling core logs in the debugger

By default, core `OHLCVService` logs use `projectLogger` (the `debug`
package) and won't appear in the React Native debugger. To make them
visible, open:

```
node_modules/@metamask/core-backend/dist/ws/ohlcv/OHLCVService.cjs
```

Find this line (near the top, around line 30):

```js
const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, SERVICE_NAME);
```

Replace with:

```js
const log = (...args) => console.log('[OHLCV-WS]', ...args);
```

Now all core logs will appear in the debugger with the `[OHLCV-WS]`
prefix, alongside the mobile hook logs. Revert with `yarn install` when
done.

---

## Group A — No Code Changes (Just Tap and Observe)

---

### Scenario 1: Basic WebSocket Subscription

**Steps:**

1. Open Token Details for a supported token (e.g., ETH on Base)
2. Wait for historical chart to load
3. Observe logs

**Expected logs:**

```
[OHLCV-WS] OHLCV-WS: Initializing — registering system-notifications callback
[OHLCV-WS] OHLCV-WS: Resubscribing active channels after reconnect {count: 0}
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, close=1986.69, ts=1778538600
```

> **Note:** `Resubscribing active channels after reconnect {count: 0}`
appears at app boot because `AccountActivityService` opened the shared
WebSocket first. OHLCVService hears the `CONNECTED` event and checks for
channels to restore — finds zero since no subscription exists yet. This
is normal.

**Verify:** Bars continue arriving every ~5s with updating `close`
prices.

---

### Scenario 2: Navigate Away (Unsubscribe + Grace Period)

**Steps:**

1. From Scenario 1, press back to leave Token Details
2. Wait 3+ seconds
3. Observe logs

**Expected logs:**

```
[OHLCV-WS] Cleanup — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, wasSubscribed=true
[OHLCV-WS] OHLCV-WS: Grace period expired — performing actual WS unsubscribe {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] OHLCV-WS: WS unsubscribe completed {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
```

**Verify:** No more bar updates after grace period expires.

---

### Scenario 3: Rapid Navigation (Grace Period Cancel)

**Steps:**

1. Open Token Details for Token A, wait for subscription
2. Navigate back
3. Immediately re-open Token A (within 3 seconds)

**Expected logs:**

```
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Cleanup — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, wasSubscribed=true
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Cancelled grace-period unsubscribe, bumped refCount {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur', refCount: 1}
```

**Verify:** `Cancelled grace-period unsubscribe, bumped refCount`
appears — subscription was reused without a server roundtrip.

---

### Scenario 4: Switch Between Tokens

**Steps:**

1. Open Token Details for Token A (e.g. ETH on Base), wait for
subscription
2. Navigate back to token list
3. Open Token B (e.g. MNT on Ethereum)

**Expected logs:**

```
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, close=1988.32, ts=1778539500
[OHLCV-WS] Cleanup — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, wasSubscribed=true
[OHLCV-WS] OHLCV-WS: Grace period expired — performing actual WS unsubscribe {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] OHLCV-WS: WS unsubscribe completed {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:1/erc20:0x3c3a...15m.eur
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: 'market-data.v1.eip155:1/erc20:0x3c3a...15m.eur'}
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:1/erc20:0x3c3a...15m.eur, close=0.59, ts=1778539500
```

**Verify:** Token A fully unsubscribes (grace period expires). Token B
gets its own subscription and bars flow.

---

### Scenario 5: Rapid Time Range Switching

**Steps:**

1. Open Token Details, wait for bars on default time range (15m)
2. Rapidly switch between time ranges (e.g. 1H → 1D → 1W → 1H)

**Expected logs (showing one switch cycle: 15m → 1h):**

```
[OHLCV-WS] Cleanup — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, wasSubscribed=true
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.1h.eur
[OHLCV-WS] OHLCV-WS: Flushing grace-period channel before new subscribe {flushedChannel: '...15m.eur', newChannel: '...1h.eur'}
[OHLCV-WS] OHLCV-WS: Grace period expired — performing actual WS unsubscribe {channel: '...15m.eur'}
[OHLCV-WS] OHLCV-WS: WS unsubscribe completed {channel: '...15m.eur'}
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: '...1h.eur'}
```

This pattern repeats for each switch (1h → 1d → 1h → 15m → 1m). Each
time, the old channel is flushed immediately before the new subscribe —
no accumulation, no server rejections.

**Verify:** Every subscribe succeeds (`Subscribe succeeded`). `Flushing
grace-period channel` appears before each new subscribe. Bars flow on
the final time range.

---

### Scenario 6: App Background / Foreground

**Steps:**

1. Open Token Details for a supported token, wait for bars to flow
2. Press home button (send app to background)
3. Wait ~10 seconds
4. Bring app back to foreground

**Expected logs:**

```
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, close=1987.42, ts=1778540400
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, close=1987.37, ts=1778540400
— app sent to background, then brought back —
[OHLCV-WS] OHLCV-WS: Resubscribing active channels after reconnect {count: 1}
[OHLCV-WS] OHLCV-WS: Resubscription succeeded {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, close=1987.18, ts=1778540400
```

**Verify:** `Resubscribing active channels after reconnect {count: 1}`
appears after foregrounding. Bars resume automatically without user
interaction.

---

### Scenario 7: Unsupported Token (No OHLCV Data)

**Steps:**

1. Open Token Details for a token with no OHLCV API data

**Expected:** No WS subscription, falls back to legacy line chart.

---

## Group B — Requires Changing DEV Constants in `useOHLCVRealtime.ts`

> After testing, set both constants back to `0` before committing.

---

### Scenario 8: WebSocket Disconnect → REST Polling Fallback

**What this tests:** The WebSocket connection drops and stays
disconnected. After the staleness threshold (30s) is exceeded, the hook
falls back to polling REST.

#### Code to add

In `useOHLCVRealtime.ts`, set the DEV constant:

```ts
const DEV_SIMULATE_WS_DISCONNECT_AFTER_MS = 10000; // ← ACTIVE
```

The simulation code in the hook must call `disconnect` (clean shutdown,
**not** `forceReconnection`):

```ts
if (DEV_SIMULATE_WS_DISCONNECT_AFTER_MS > 0) {
  setTimeout(() => {
    console.log(
      `[OHLCV-WS] DEV: Simulating WS disconnect (no reconnect) after ${DEV_SIMULATE_WS_DISCONNECT_AFTER_MS}ms`,
    );
    Engine.controllerMessenger.call(
      'BackendWebSocketService:disconnect' as never,
    );
  }, DEV_SIMULATE_WS_DISCONNECT_AFTER_MS);
}
```

#### How it works

After 10s, calls `BackendWebSocketService:disconnect` (clean shutdown,
no auto-reconnect). The WS stays dead. After 30s with no bars, staleness
triggers REST polling every 15s.

#### Steps to test

1. Set the constants as shown above
2. Rebuild / hot-reload the app
3. Open Token Details for a supported token
4. Wait for bars to start flowing (~5s)
5. At 10s, the simulated disconnect fires automatically
6. Wait ~30s for the staleness threshold
7. Observe REST fallback polling in logs

#### Expected logs:

```
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Subscribe succeeded — new WS subscription created {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur'}
[OHLCV-WS] Bar received — channel=market-data.v1.eip155:8453/slip44:60.15m.eur, close=1985.08, ts=1778540400
[OHLCV-WS] DEV: Simulating WS disconnect (no reconnect) after 10000ms
[OHLCV-WS] Stream stale or chain down — isStale=true, chainDown=false, elapsed=38975ms
[OHLCV-WS] Polling /latest via REST fallback
[OHLCV-WS] Stream stale or chain down — isStale=true, chainDown=false, elapsed=44886ms
[OHLCV-WS] Polling /latest via REST fallback
```

**Verify:** After the simulated disconnect, no more `Bar received` logs.
REST polling kicks in every 15s once staleness threshold (30s) is
exceeded.

---

## Group C — Requires Editing `.cjs` in node_modules

> After testing, run `yarn install` in the mobile repo to restore the
original file.

---

### Scenario 10: Subscribe Failure / Error Recovery

**What this tests:** `OHLCVService.subscribe()` fails. The service
catches the error, publishes `OHLCVService:subscriptionError`, forces
reconnection, and REST fallback keeps the chart alive.

#### Code to add

**1. Disable dev simulation constant** in `useOHLCVRealtime.ts`:

```ts
const DEV_SIMULATE_WS_DISCONNECT_AFTER_MS = 0;
```

**2. Simulate subscribe failure** — open
`node_modules/@metamask/core-backend/dist/ws/ohlcv/OHLCVService.cjs`.

Find the subscribe call (look for `BackendWebSocketService:subscribe`)
and comment it out, then add a throw:

```js
// await __classPrivateFieldGet(this, _OHLCVService_messenger, "f").call('BackendWebSocketService:subscribe', {
//     channels: [channel],
//     channelType: SUBSCRIPTION_NAMESPACE,
//     callback: (notification) => {
//         __classPrivateFieldGet(this, _OHLCVService_instances, "m", _OHLCVService_handleBarUpdate).call(this, channel, notification);
//     },
// });
throw new Error('DEV: Simulated subscribe failure — invalid channel');
```

#### Steps to test

1. Apply both code changes above
3. Reload the app
4. Open Token Details for a supported token
5. Observe logs

#### Expected — look for these key logs:

```
[OHLCV-WS] OHLCV-WS: Resubscribing active channels after reconnect {count: 0}
[OHLCV-WS] Debounce fired — calling OHLCVService:subscribe for market-data.v1.eip155:8453/slip44:60.15m.eur
[OHLCV-WS] OHLCV-WS: Subscription failed, forcing reconnection {channel: 'market-data.v1.eip155:8453/slip44:60.15m.eur', error: Error: Test error ...}
[OHLCV-WS] Subscription error on market-data.v1.eip155:8453/slip44:60.15m.eur: Error: Test error (subscribe)
[OHLCV-WS] OHLCV-WS: Forcing WebSocket reconnection
[OHLCV-WS] OHLCV-WS: Resubscribing active channels after reconnect {count: 0}
[OHLCV-WS] Stream stale or chain down — isStale=true, chainDown=false, elapsed=44219ms
[OHLCV-WS] Polling /latest via REST fallback
```

**Verify:** Error is caught, reconnection attempted (`Forcing WebSocket
reconnection`), and REST fallback keeps chart alive after staleness is
detected.

---

## Log Reference

All logs use the **`OHLCV-WS`** prefix. Filter by `OHLCV-WS` in Flipper
/ debugger.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Adds websocket streaming integration for ohlcv data

## **Related issues**

Fixes:
https://consensyssoftware.atlassian.net/browse/ASSETS-3194?atlOrigin=eyJpIjoiYmQ4N2E3MTlmZTFlNGYyNGFiODUxNzA2YThmM2FkYTkiLCJwIjoiaiJ9
Related: MetaMask/core#8695

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [ ] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [ ] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [ ] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.



<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Introduces a new Engine-integrated WebSocket service and a real-time
data path for price charts, which could impact app lifecycle, network
subscriptions, and chart correctness if misconfigured. Includes a REST
polling fallback and feature-flag gating, reducing blast radius but
still touching core infrastructure.
> 
> **Overview**
> Adds real-time OHLCV candlestick streaming to the token details
advanced chart by wiring `OHLCVService` (from `@metamask/core-backend`)
into the Engine/messenger layer and upgrading `@metamask/core-backend`
to `^6.3.0`.
> 
> Introduces `useOHLCVRealtime`, which subscribes (debounced) to
`OHLCVService` bar updates and provides a staleness/chain-down HTTP
`/latest` fallback, then feeds updates into `AdvancedChart` via its
existing `realtimeBar` prop.
> 
> Gates the behavior behind a new remote, version-gated feature flag
`tokenDetailsOhlcvWsIntegration` (registry + selector + CI constant
mapping) and updates related unit tests/mocks to account for the new
hook and selector.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
fe6f560. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Bernardo Garces Chapero <bernardo.chapero@consensys.net>
Co-authored-by: Prithpal Sooriya <prithpal.sooriya@consensys.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants